package com.topideal.supplychain.hades.schedule;//package com.topideal.supplychain.hades.schedule;
//
//import java.lang.reflect.InvocationTargetException;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//import org.apache.log4j.Logger;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.StringUtils;
//import com.topideal.supplychain.framework.common.SpringUtils;
//import com.topideal.supplychain.hades.log.model.MessageHis;
//import com.topideal.supplychain.hades.log.service.MessageHisService;
//import com.topideal.supplychain.hades.task.model.TskMessage;
//import com.topideal.supplychain.hades.task.service.TskMessageService;
//import com.topideal.supplychain.hades.util.LogUtils;
//
///**
// * @author wanwei
// * @TODO 失败重分发定时任务
// * @date: 2017年11月14日 下午3:38:39
// */
//@Component("MessageBaseSchedule")
//public class MessageBaseSchedule {
//    private Logger logger;
//    private String serviceName;
//    private String groupName;
//    private Integer maxCallCount;
//    private Integer maxNum;
//    private Integer intervalMinute;
//
//    @Autowired
//    protected TskMessageService messageService;
//
//    @Autowired
//    private MessageHisService messageHisService;
//
//    public MessageBaseSchedule() {
//
//        logger = Logger.getLogger(MessageBaseSchedule.class);
//
//        this.maxCallCount = Integer.valueOf(5);
//
//        this.maxNum = Integer.valueOf(500);
//
//        this.intervalMinute = Integer.valueOf(20);
//
//        this.serviceName = "MESSAGE_DISPATCH_ONLY";
//    }
//
//    public void MessageBase() {
//
//
//        logger.info("begin execute job..");
//        long t0 = System.nanoTime();
//        boolean isFinished = false;
//        do {
//            List<TskMessage> unProcessedData = findUnProcessedData();
//            if (unProcessedData == null) {
//                break;
//            }
//
//            for (Iterator<TskMessage> i$ = unProcessedData.iterator(); i$.hasNext();) {
//                TskMessage t = i$.next();
//                processSingleData(t);
//            }
//
//            isFinished = isFinished(unProcessedData);
//        } while (!(isFinished));
//
//        long dt = System.currentTimeMillis() - t0;
//        logger.info("end execute job, cost " + dt + " ms");
//    }
//
//    protected boolean isFinished(List<?> list) {
//        return CollectionUtils.isEmpty(list);
//    }
//
//    protected List<TskMessage> findUnProcessedData() {
//        /*
//         * MessageDTO queryDto = new MessageDTO(); queryDto.setServiceName(getServiceName());
//         * queryDto.setGroupName(getGroupName()); queryDto.setMaxCallCount(getMaxCallCount());
//         * queryDto.setMaxQueryCount(getMaxNum()); Date intervalDate = DateUtil.add(new Date(), 12,
//         * -this.intervalMinute.intValue()); queryDto.setIntervalDate(intervalDate);
//         */
//        Map<String, Object> param = new HashMap<>();
//        param.put("serviceName", getServiceName());
//        param.put("groupName", getGroupName());
//        param.put("maxCallCount", getMaxCallCount());
//        param.put("maxQueryCount", getMaxNum());
//        // Date intervalDate = DateUtil.dateAdd(AddpartEnum.MI,
//        // DateUtil.getNowTime(),-this.intervalMinute.intValue());
//        // param.put("intervalDate", intervalDate);
//        List<TskMessage> logsList = messageService.findLimitListByDto(param);
//        return logsList;
//    }
//
//    protected void processSingleData(TskMessage message) {
//        if ((null == message) || (StringUtils.isEmpty(message.getServiceName())))
//            return;
//        try {
//            Object srv = SpringUtils.getBean("messageBaseSchduleServiceImpl");
//            srv.getClass().getMethod("messageSchedule", new Class[] {TskMessage.class}).invoke(srv,
//                    new Object[] {message});
//
//            removeMessage2His(message);
//        } catch (Exception e) {
//            String errorMsg = null;
//            if (e instanceof InvocationTargetException) {
//                InvocationTargetException e1 = (InvocationTargetException) e;
//                if ((null != e1) && (null != e1.getTargetException()))
//                    errorMsg = e1.getTargetException().getMessage();
//                else
//                    errorMsg = "message异常信息为空";
//            } else {
//                errorMsg = e.getMessage();
//            }
//            logger.error("重调失败, message=" + message, e);
//            String errorLog = "重调失败, Exception:  " + errorMsg;
//            updateMessage(message, errorLog);
//        }
//    }
//
//    private void removeMessage2His(TskMessage message) {
//        try {
//            MessageHis hisDTO = message.toMessageHis();
//            // hisDTO = MessageAssembler.msg2msgHisDTO(message);
//            // hisDTO.setState(EnumConstants.MessageState.FINISH.getValue());
//
//            String errorLog = hisDTO.getErrorLog();
//            errorLog = LogUtils.subErrorMessage(errorLog);
//            hisDTO.setErrorLog(errorLog);
//            messageHisService.insert(hisDTO);
//            messageService.delete(message.getId());
//        } catch (Exception e) {
//            logger.error("messge信息备份到历史表失败, message=" + message, e);
//        }
//    }
//
//    private void updateMessage(TskMessage message, String errorLog) {
//        try {
//            TskMessage messageDTO = new TskMessage();
//            messageDTO.setId(message.getId());
//            errorLog = LogUtils.subErrorMessage(errorLog);
//            messageDTO.setErrorLog(errorLog);
//            Integer callCount = Integer.valueOf(message.getCallCount().intValue() + 1);
//            messageDTO.setCallCount(callCount);
//            messageDTO.setUpdateTime(new Date());
//            // messageDTO.setState(EnumConstants.MessageState.ERROR.getValue());
//            messageService.update(messageDTO);
//        } catch (Exception e) {
//            logger.error(errorLog + " 插入message表异常", e);
//        }
//    }
//
//    public void onlyRetry(TskMessage message) {
//        this.processSingleData(message);
//    }
//
//    public String getServiceName() {
//        return this.serviceName;
//    }
//
//    public void setServiceName(String serviceName) {
//        this.serviceName = serviceName;
//    }
//
//    public Integer getMaxCallCount() {
//        return this.maxCallCount;
//    }
//
//    public void setMaxCallCount(Integer maxCallCount) {
//        this.maxCallCount = maxCallCount;
//    }
//
//    public TskMessageService getMessageService() {
//        return this.messageService;
//    }
//
//    public void setMessageService(TskMessageService messageService) {
//        this.messageService = messageService;
//    }
//
//    public String getGroupName() {
//        return this.groupName;
//    }
//
//    public void setGroupName(String groupName) {
//        this.groupName = groupName;
//    }
//
//    public Integer getIntervalMinute() {
//        return this.intervalMinute;
//    }
//
//    public void setIntervalMinute(Integer intervalMinute) {
//        this.intervalMinute = intervalMinute;
//    }
//
//    /**
//     * 获取maxNum
//     * 
//     * @return maxNum
//     */
//    public Integer getMaxNum() {
//        return maxNum;
//    }
//
//    /**
//     * 设置maxNum
//     * 
//     * @param maxNum
//     */
//    public void setMaxNum(Integer maxNum) {
//        this.maxNum = maxNum;
//    }
//
//}
